입력층(x), 은닉층(h), 출력층(o) 모두 벡터이고 여러개의 윤닛이 있다고 가정
Output of RNN일반적으로 RNN은 입력이 시퀀스인 다대일, 다대다 모델이 해당한다.
전형적으로 순환층(RNN)은 시퀀스 출력 <o0, o1, o2, …, oT>를 반환하거나,
마지막 출력(t=T일 때의 oT)을 반환한다.
tf.keras API에서 return_sequences 매개변수를 True 또는 False로 지정해서 선택
RNN Structure
기본 피드포워드 네트워크에서 정보는 입력에서 은닉층으로, 은닉층에서 출력층으로 전달된다.
순환 네트워크(RNN)에서는 은닉층이 현재 타임 스탭(time step)의 입력층과 이전 타입 스텝의 은닉층으로부터 정보를 받는다.
인접한 타임 스텝의 정보가 은닉층에 흐르기 때문에 네트워크가 이전 이벤트를 기억할 수 있다.
(정보 흐름은 루프(loop)로 표시, 그래프 표기법에서는 순환 에지(recurrent edge)라고 부른다.)
RNN에서 은닉층이 하나인 모델은 단일층RNN이라고 부른다. (아달린이나 로지스틱 회귀와 같은 은닉층이 없는 단일층 신경망 다르다!!)
RNN(위 그림)에서 각 단계에서 사용하는 가중치는 모두 동일하다.
RNN은 일련의 타입 스텝을 처리한 후 가중치를 업데이트 한다.
RNN의 은닉 유닛은 입력층으로부터 받는 입력과 같은 은닉층에서 t-1 타입 스텝 활성화 출력으로부터 받는 입력 총 2개의 입력을 받는다.
(일반 신경망의 은닉 유닛은 입력층에 연결된 최종 입력 하나만 받는다.)
t=0에서는 은닉 유닛이 0 또는 작은 난수로 초기화 된다.
t>0인 타임 스텝에서 은닉 유닛이 현재 타입 스텝의 데이터 포인트 x_t와 이전 타입 스텝 t-1의 은닉 유닛 값 h_(t-1)을 입력으로 받는다.
layer=1: 은닉층의 출력을 h1_t로 표현한다. 데이터 포인트 x_t와 이 은닉층의 이전 타임스텝 출력 h1_t-1을 입력으로 받는다.
layer=2: 두 번째 은닉층의 h2_t는 이전 층의 현재 타임 스텝 출력 o1_t와 이 은닉층의 이전 타임 스텝 출력 h2_t-1을 입력으로 받는다.
(x1_t=o1_t)
위의 경우 각 은닉층이 시퀀스를 입력으로 받기 때문에 마지막을 제외하고 모든 순환층은 시퀀스를 출력으로 반환해야 한다.(return_sequences=True)
마지막 순환층은 문제 유혀에 따라 결정
RNN activation Output
유향 엣지(directed edge): 층 사이 연결과 순환 연결
유향 엣지는 가중치 행렬과 연관된다. 가중치는 특정 시간 t에 종속적이지 않고, 전체 시간 축에 공유된다.
W_xh: 입력 x_t와 은닉층 h 사이의 가중치 행렬
W_hh: 순환 에지에 연관된 가중치 행렬
W_ho: 은닉층과 출력층 사이의 가중치 행렬
W_h: W_hh와 W_xh를 합쳐 연결된 행렬
은닉층의 최종 입력 z_h (time=t)
b_h은 은닉 유닛의 절편 벡터
z_h=W_xh * x_t+W_hh * h_t-1 + b_h (*는 행렬 곱 연산)
h_t=phi_h(z_h)=phi_h(W_xh * x_t+W_hh * h_t-1 + b_h)
(W_h)를 이용해서 이와같이 표현 할 수 있다.
출력 유닛의 활성화
o_t=phi_o(W_ho * h_t + b_o)
위에서 은닉층의 유닛이 다섯 개이고, W_hh의 크기가 5x5이다.
이전 타임 스텝의 은닉층 출력(h_t-1)은 현재 타입 스텝의 은닉 유닛(h_t=phi_h(z_h)에 완전 연결된다.
BPTT(BackPropagation Through Time) for RNN
RNN에서 전체 손실 L은 t=1에서 t=T 까지의 각 타입 스텝의 모든 소실 함수의 합이다.
타임 스텝 t에서 손실은 이전 모든 이전 타임 스텝 1: t-1의 은닉 유닛에 의존하기 때문에 그레이디언트는 아래와 같다.
자세한 내용 BPTT 참고